/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pl.tewi.controllers;

import java.util.List;
import pl.tewi.exceptions.ApplicationDeploymentException;
import pl.tewi.types.ApplicationDesc;

/**
 * Bazowa klasa służąca do budowania aplikacji i modułów do wdrożenia na serwer aplikacyjny
 * 
 * @author Marcin Kwapisz
 */
public abstract class BaseApplicationAssembler implements ApplicationAssembler {

    /**
     * Domyślny pusty konstruktor
     */
    public BaseApplicationAssembler() {
    }

    /**
     * Może zawierać dowolną liczbę archiwum war i jar.
     * Jeżeli w adnotacji Application określono typ aplikacji jako {@link ApplicationType.EAR}
     * to muszą być zawarte w niej moduły
     * @param applicationDesc 
     * @return obiekt reprezentujący opis aplikacji typu EAR do zainstalowania
     * na serwerze aplikacyjnycm
     * @throws ApplicationDeploymentException problem z budową opisu archiwum EAR
     */
    protected abstract Object buildEAR(ApplicationDesc applicationDesc) throws ApplicationDeploymentException;

    /**
     * Archiwum z komponentami EJB. Jezeli okreśono aplikację jako {@link ApplicationType.JAR}
     * to nie może ona zawierać modułów.
     * @param appName nazwa aplikacji
     * @param appPath scieżka do aplikacji
     * @param descriptors lista deskryptorów instalacyjnych
     * @return obiekt reprezentujący opis aplikacji typu JAR do zainstalowania
     * na serwerze aplikacyjnym
     * @throws ApplicationDeploymentException
     */
    protected abstract Object buildJAR(String appName, String appPath, List<String> descriptors) throws ApplicationDeploymentException;

    /**
     * Archiwum z modułem WAR do załączenia w EAR.
     * @param appName nazwa modułu war
     * @param appPath ścieżka do modułu WAR (katalog albo plik)
     * @return Opis mudułu WAR do załączenia do archiwum typu EAR
     * @throws ApplicationDeploymentException problem z budową opisu modułu WAR
     */
    protected abstract Object buildWAR(String appName, String appPath) throws ApplicationDeploymentException;

    /**
     * Archiwum może zawierać jar z komponentami EJB. Jeżeli adnotacja Application
     * jest typu {@link ApplicationType.WAR} to może zawierać moduły typu .
     * {@link ApplicationType.JAR} [0..N)
     * @param applicationDesc opis aplikacji WAR uzyskany na podstawie adnotacji
     * @return Opis aplikacji typu WAR do instalacji na serwerze aplikacyjnym
     * @throws ApplicationDeploymentException problem z budową opisu aplikacji 
     * WAR
     */
    protected abstract Object buildWAR(ApplicationDesc applicationDesc) throws ApplicationDeploymentException;

    /**
     * Sprawdzenie poprawności opisu aplikacji pod względem zgodności z JEE.
     * @param applicationDesc opis aplikacji {@link ApplicationDesc}
     * @return true jeżeli konfiguracja aplikacji jest prawidłowa
     */
    protected boolean validateApplicationConfiguration(ApplicationDesc applicationDesc) {
        return true;
    }
}
